Fork me on GitHub

设计模式 - 访问者

注意:所有文章除特别说明外,转载请注明出处.

简介

在该模式中,使用访问者类,其改变了元素类的执行算法。根据模式,元素对象已接受访问者对象,这样访问者对象就可以处理元素对象上的操作。

场景

1. 一个数据结构(List/Set/Map)包含很多类型对象

2. 数据结构与数据操作分离

优点

1. 增加新的操作很容易,即增加一个新的访问者

缺点

1. 增加新的数据结构困难

2. 具体元素变更比较麻烦

相关设计模式

访问者模式和迭代器模式

访问者模式

1.定义表示元素的接口

public interface ComputerPart {
   public void accept(ComputerPartVisitor computerPartVisitor);
}

2.创建扩展上述类的实体类

public class Keyboard  implements ComputerPart {
   @Override
   public void accept(ComputerPartVisitor computerPartVisitor) {
      computerPartVisitor.visit(this);
   }
}

public class Monitor  implements ComputerPart {
   @Override
   public void accept(ComputerPartVisitor computerPartVisitor) {
      computerPartVisitor.visit(this);
   }
}

public class Mouse  implements ComputerPart {
   @Override
   public void accept(ComputerPartVisitor computerPartVisitor) {
      computerPartVisitor.visit(this);
   }
}

public class Computer implements ComputerPart {
   ComputerPart[] parts;

   public Computer(){
      parts = new ComputerPart[] {new Mouse(), new Keyboard(), new Monitor()};      
   } 

   @Override
   public void accept(ComputerPartVisitor computerPartVisitor) {
      for (int i = 0; i < parts.length; i++) {
         parts[i].accept(computerPartVisitor);
      }
      computerPartVisitor.visit(this);
   }
}

3.定义一个表示访问者的接口

public interface ComputerPartVisitor {
   public void visit(Computer computer);
   public void visit(Mouse mouse);
   public void visit(Keyboard keyboard);
   public void visit(Monitor monitor);
}

4.创建实现上述类的实体访问者

public class ComputerPartDisplayVisitor implements ComputerPartVisitor {

   @Override
   public void visit(Computer computer) {
      System.out.println("Displaying Computer.");
   }

   @Override
   public void visit(Mouse mouse) {
      System.out.println("Displaying Mouse.");
   }

   @Override
   public void visit(Keyboard keyboard) {
      System.out.println("Displaying Keyboard.");
   }

   @Override
   public void visit(Monitor monitor) {
      System.out.println("Displaying Monitor.");
   }
}

5.使用 ComputerPartDisplayVisitor 来显示 Computer 的组成部分

public class VisitorPatternDemo {
   public static void main(String[] args) {

      ComputerPart computer = new Computer();
      computer.accept(new ComputerPartDisplayVisitor());
   }
}

总结

访问者模式表示一个作用于某对象结构中的各元素的操作,它使我们可以在不改变各元素的类的前提下定义作用于这些元素的新操作。我们需要清楚的知道访问者模式适用于数据结构相对稳定的系统。

访问者模式角色:

    1.抽象访问者
    2.具体访问者
    3.抽象元素
    4.具体元素
    5.对象结构

本文标题:设计模式 - 访问者

文章作者:Bangjin-Hu

发布时间:2019年10月15日 - 09:22:26

最后更新:2020年03月30日 - 08:23:32

原始链接:http://bangjinhu.github.io/undefined/设计模式 - 访问者模式/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

Bangjin-Hu wechat
欢迎扫码关注微信公众号,订阅我的微信公众号.
坚持原创技术分享,您的支持是我创作的动力.